home *** CD-ROM | disk | FTP | other *** search
/ PC Graphics Unleashed / PC Graphics Unleashed.iso / ch18 / rtrace / 3ds2scn.awk < prev    next >
Text File  |  1994-01-02  |  7KB  |  343 lines

  1. BEGIN {
  2.   pi = 4.0 * atan2(1, 1)
  3.   CONVFMT = "%.10g"
  4.   OFMT = "%.10g"
  5.   tol = 0.00005
  6.   verbose = 2
  7. }
  8. function abs(a) {
  9.   return (a > 0 ? a : -a)
  10. }
  11. /^Ambient[ \t]+[Ll]ight[ \t]+[Cc]olor/ {
  12.   r = substr($4, 5)
  13.   g = substr($5, 7)
  14.   b = substr($6, 6)
  15.   print "ambient", r, g, b
  16.   next
  17. }
  18. /^Background[ \t]+[Ss]olid[ \t]+[Cc]olor/ {
  19.   r = substr($4, 5)
  20.   g = substr($5, 7)
  21.   b = substr($6, 6)
  22.   print "background", r, g, b
  23.   bg = 1
  24.   next
  25. }
  26. /^Named[ \t]+[Oo]bject/ {
  27.   if (ft != 0 && f != ft) {
  28.     print "Error: too few triangles" >"/dev/stderr"
  29.     ft = 0
  30.     exit
  31.   }
  32.   if (ft != 0) {
  33.     for (i = 0; i < ft; i++) {
  34.       i1 = v1[i]
  35.       if (y[i1] == "R") i1 = x[i1]
  36.       i2 = v2[i]
  37.       if (y[i2] == "R") i2 = x[i2]
  38.       i3 = v3[i]
  39.       if (y[i3] == "R") i3 = x[i3]
  40.       if (i1 == i2 || i1 == i3 || i2 == i3) {
  41.         fdg++
  42.         continue
  43.       }
  44.       s = m[i]
  45.       if (i in fs) {
  46.         if (abs(nx[i1]) < tol && abs(ny[i1]) < tol && abs(nz[i1]) < tol) {
  47.           fdg++
  48.           continue
  49.         }
  50.         if (abs(nx[i2]) < tol && abs(ny[i2]) < tol && abs(nz[i2]) < tol) {
  51.           fdg++
  52.           continue
  53.         }
  54.         if (abs(nx[i3]) < tol && abs(ny[i3]) < tol && abs(nz[i3]) < tol) {
  55.           fdg++
  56.           continue
  57.         }
  58.         print "triangle normal", s, \
  59.           x[i1], y[i1], z[i1], nx[i1], ny[i1], nz[i1], \
  60.           x[i2], y[i2], z[i2], nx[i2], ny[i2], nz[i2], \
  61.           x[i3], y[i3], z[i3], nx[i3], ny[i3], nz[i3]
  62.       } else
  63.         print "triangle", s, x[i1], y[i1], z[i1], \
  64.           x[i2], y[i2], z[i2], x[i3], y[i3], z[i3]
  65.     }
  66.     for (i in x) delete x[i]
  67.     for (i in y) delete y[i]
  68.     for (i in z) delete z[i]
  69.     for (i in nx) delete nx[i]
  70.     for (i in ny) delete ny[i]
  71.     for (i in nz) delete nz[i]
  72.     for (i in v1) delete v1[i]
  73.     for (i in v2) delete v2[i]
  74.     for (i in v3) delete v3[i]
  75.     for (i in fs) delete fs[i]
  76.     for (i in m) delete m[i]
  77.   }
  78.   oname = $3
  79.   for (i = 4; i <= NF; i++) oname = oname""$i
  80.   otype = 0
  81.   ft = 0
  82.   print ";", oname
  83.   if (verbose) printf "\n%s", oname >"/dev/stderr"
  84.   next
  85. }
  86. /^Tri-mesh/ {
  87.   if (otype != 0) {
  88.     print "Error: bad object" >"/dev/stderr"
  89.     exit
  90.   }
  91.   otype = 1
  92.   v = 0
  93.   f = 0
  94.   vt = $3
  95.   fast = 0
  96.   if (vt > 500) fast = 1
  97.   ft = $5
  98.   if (verbose) print ":", vt, ft >"/dev/stderr"
  99.   if (verbose > 1) {
  100.     vcnt = int(vt / 65) + 1
  101.     fcnt = int(ft / 65) + 1
  102.   }
  103.   next
  104. }
  105. /^Vertex[ \t]+[Ll]ist/ {
  106.   if (verbose > 1) {
  107.     printf "vertices: " >"/dev/stderr"
  108.     cnt = 0
  109.   }
  110.   next
  111. }
  112. /^Vertex[ \t]+[0-9]+/ {
  113.   if (otype != 1) {
  114.     print "Error: bad vertex" >"/dev/stderr"
  115.     exit
  116.   }
  117.   if (verbose > 1) {
  118.     cnt++
  119.     if (cnt % vcnt == 0) printf "." >"/dev/stderr"
  120.   }
  121.   if (!fast) {
  122.     for (vr = 0; vr < v; vr++) {
  123.       if (abs(x[vr] - $4) < tol && \
  124.           abs(y[vr] - $6) < tol && \
  125.           abs(z[vr] - $8) < tol) break
  126.     }
  127.     if (vr != v) {
  128.       vdg++
  129.       x[v] = vr
  130.       y[v] = "R"
  131.       z[v] = ""
  132.       v++
  133.       if (v > vt) {
  134.         print "Error: too many vertices" >"/dev/stderr"
  135.         exit
  136.       }
  137.       next
  138.     }
  139.   }
  140.   x[v] = $4
  141.   y[v] = $6
  142.   z[v] = $8
  143.   v++
  144.   if (v > vt) {
  145.     print "Error: too many vertices" >"/dev/stderr"
  146.     exit
  147.   }
  148.   next
  149. }
  150. /^Face[ \t]+[Ll]ist/ {
  151.   if (v != vt) {
  152.     print "Error: too few vertices" >"/dev/stderr"
  153.     exit
  154.   }
  155.   if (verbose > 1) {
  156.     printf "\n   faces: " >"/dev/stderr"
  157.     cnt = 0
  158.   }
  159.   next
  160. }
  161. /^Face[ \t]+[0-9]+/ {
  162.   if (verbose > 1) {
  163.     cnt++
  164.     if (cnt % fcnt == 0) printf "." >"/dev/stderr"
  165.   }
  166.   v1[f] = $4
  167.   v2[f] = $6
  168.   v3[f] = $8
  169.   f++
  170.   if (f > ft) {
  171.     print "Error: too many triangles" >"/dev/stderr"
  172.     ft = 0
  173.     exit
  174.   }
  175.   next
  176. }
  177. /^Material/ {
  178.   if (NF <= 1) s = "DEFAULT"
  179.   if (NF > 1) s = $2
  180.   for (i = 3; i <= NF; i++) s = s""$i
  181.   if (!(s in mlist)) {
  182.     mlist[s] = ""
  183.     print "#define", s, "surface matte white data"
  184.   }
  185.   m[f - 1] = s
  186.   next
  187. }
  188. /^Smoothing/ {
  189.   fs[f - 1] = ""
  190.   i1 = v1[f - 1]
  191.   if (y[i1] == "R") i1 = x[i1]
  192.   p1x = x[i1]
  193.   p1y = y[i1]
  194.   p1z = z[i1]
  195.   i2 = v2[f - 1]
  196.   if (y[i2] == "R") i2 = x[i2]
  197.   p2x = x[i2] - p1x
  198.   p2y = y[i2] - p1y
  199.   p2z = z[i2] - p1z
  200.   i3 = v3[f - 1]
  201.   if (y[i3] == "R") i3 = x[i3]
  202.   p3x = x[i3] - p1x
  203.   p3y = y[i3] - p1y
  204.   p3z = z[i3] - p1z
  205.   p1x = p2y * p3z - p2z * p3y
  206.   p1y = p2z * p3x - p2x * p3z
  207.   p1z = p2x * p3y - p2y * p3x
  208.   t = sqrt(p1x * p1x + p1y * p1y + p1z * p1z)
  209.   if (t < tol) {
  210.     f--
  211.     ft--
  212.     next
  213.   }
  214.   p1x /= t
  215.   p1y /= t
  216.   p1z /= t
  217.   if (!(i1 in nx)) {
  218.     nx[i1] = 0
  219.     ny[i1] = 0
  220.     nz[i1] = 0
  221.   }
  222.   nx[i1] += p1x
  223.   ny[i1] += p1y
  224.   nz[i1] += p1z
  225.   if (!(i2 in nx)) {
  226.     nx[i2] = 0
  227.     ny[i2] = 0
  228.     nz[i2] = 0
  229.   }
  230.   nx[i2] += p1x
  231.   ny[i2] += p1y
  232.   nz[i2] += p1z
  233.   if (!(i3 in nx)) {
  234.     nx[i3] = 0
  235.     ny[i3] = 0
  236.     nz[i3] = 0
  237.   }
  238.   nx[i3] += p1x
  239.   ny[i3] += p1y
  240.   nz[i3] += p1z
  241.   next
  242. }
  243. /^Direct[ \t]+[Ll]ight/ {
  244.   getline
  245.   px = $3
  246.   py = $5
  247.   pz = $7
  248.   ltype = 1
  249.   getline
  250.   while ($1 != "Light") {
  251.     if ($1 == "Spotlight") {
  252.       ltype = 2
  253.       sx = $4 - px
  254.       sy = $6 - py
  255.       sz = $8 - pz
  256.     }
  257.     if ($1 == "Falloff") {
  258.       f = $3
  259.     }
  260.     getline
  261.   }
  262.   r = substr($3, 5)
  263.   g = substr($4, 7)
  264.   b = substr($5, 6)
  265.   if (ltype == 1) print "light point", px, py, pz, r, g, b
  266.   if (ltype == 2) print "light spot", px, py, pz, sx, sy, sz, \
  267.     r, g, b, f / 2, 2
  268.   next
  269. }
  270. /^Camera/ {
  271.   if (NF > 1) {
  272.     i = 1
  273.     fd = ""
  274.     t = substr($2, 2, 1)
  275.     while (t != "m") {
  276.       fd = fd""t
  277.       t = substr($2, 2 + i, 1)
  278.       i++
  279.     }
  280.     printf "fov %.6g ;%.10g mm\n", atan2(46.0, fd) * 90 / pi, fd
  281.   }
  282.   getline
  283.   px = $3
  284.   py = $5
  285.   pz = $7
  286.   print "eye", px, py, pz
  287.   getline
  288.   px = $3
  289.   py = $5
  290.   pz = $7
  291.   print "look", px, py, pz
  292.   getline
  293.   print "up 0 0 1"
  294.   next
  295. }
  296. END {
  297.   if (ft != 0 && f != ft) {
  298.     print "Error: too few triangles" >"/dev/stderr"
  299.     exit
  300.   }
  301.   if (ft != 0) {
  302.     for (i = 0; i < ft; i++) {
  303.       i1 = v1[i]
  304.       if (y[i1] == "R") i1 = x[i1]
  305.       i2 = v2[i]
  306.       if (y[i2] == "R") i2 = x[i2]
  307.       i3 = v3[i]
  308.       if (y[i3] == "R") i3 = x[i3]
  309.       if (i1 == i2 || i1 == i3 || i2 == i3) {
  310.         fdg++
  311.         continue
  312.       }
  313.       s = m[i]
  314.       if (i in fs) {
  315.         if (abs(nx[i1]) < tol && abs(ny[i1]) < tol && abs(nz[i1]) < tol) {
  316.           fdg++
  317.           continue
  318.         }
  319.         if (abs(nx[i2]) < tol && abs(ny[i2]) < tol && abs(nz[i2]) < tol) {
  320.           fdg++
  321.           continue
  322.         }
  323.         if (abs(nx[i3]) < tol && abs(ny[i3]) < tol && abs(nz[i3]) < tol) {
  324.           fdg++
  325.           continue
  326.         }
  327.         print "triangle normal", s, \
  328.           x[i1], y[i1], z[i1], nx[i1], ny[i1], nz[i1], \
  329.           x[i2], y[i2], z[i2], nx[i2], ny[i2], nz[i2], \
  330.           x[i3], y[i3], z[i3], nx[i3], ny[i3], nz[i3]
  331.        } else
  332.         print "triangle", s, x[i1], y[i1], z[i1], \
  333.           x[i2], y[i2], z[i2], x[i3], y[i3], z[i3]
  334.     }
  335.   }
  336.   if (!bg) print "background black"
  337.   if (verbose > 1) print "" >"/dev/stderr"
  338.   if (vdg > 0) \
  339.     print "Warning: bad vertices -", vdg >"/dev/stderr"
  340.   if (fdg > 0) \
  341.     print "Warning: bad triangles -", fdg >"/dev/stderr"
  342. }
  343.